using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Sampling
{
    /// <summary>
    /// <para>Generate Tessellation</para>
    /// <para>Generates a tessellated grid of regular polygon features to cover a given extent.  The tessellation can be of triangles, squares, diamonds, hexagons, or transverse hexagons.</para>
    /// <para>生成常规面要素的镶嵌格网以覆盖给定范围。 镶嵌可以是三角形、正方形、菱形、六边形或横向六边形。</para>
    /// </summary>    
    [DisplayName("Generate Tessellation")]
    public class GenerateTessellation : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GenerateTessellation()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_Output_Feature_Class">
        /// <para>Output Feature Class</para>
        /// <para>The path and name of the output feature class containing the tessellated grid.</para>
        /// <para>包含镶嵌格网的输出要素类的路径和名称。</para>
        /// </param>
        /// <param name="_Extent">
        /// <para>Extent</para>
        /// <para><xdoc>
        ///   <para>The extent that the tessellation will cover. This can be the currently visible area, the extent of a dataset, or manually entered values.</para>
        ///   <bulletList>
        ///     <bullet_item>Default—The extent will be based on the maximum extent of all participating inputs. This is the default.</bullet_item><para/>
        ///     <bullet_item>Union of Inputs—The extent will be based on the maximum extent of all inputs.</bullet_item><para/>
        ///     <bullet_item>Intersection of Inputs—The extent will be based on the minimum area common to all inputs.</bullet_item><para/>
        ///     <bullet_item>Current Display Extent—The extent is equal to the visible display. The option is not available when there is no active map.</bullet_item><para/>
        ///     <bullet_item>As Specified Below—The extent will be based on the minimum and maximum extent values specified.</bullet_item><para/>
        ///     <bullet_item>Browse—The extent will be based on an existing dataset.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>镶嵌将覆盖的范围。这可以是当前可见区域、数据集的范围或手动输入的值。</para>
        ///   <bulletList>
        ///     <bullet_item>默认值 - 范围将基于所有参与输入的最大范围。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>输入并集 - 范围将基于所有输入的最大范围。</bullet_item><para/>
        ///     <bullet_item>输入交点 - 范围将基于所有输入共有的最小面积。</bullet_item><para/>
        ///     <bullet_item>当前显示范围 - 范围等于可见显示。当没有活动地图时，该选项不可用。</bullet_item><para/>
        ///     <bullet_item>如下所述 - 范围将基于指定的最小和最大范围值。</bullet_item><para/>
        ///     <bullet_item>浏览 - 范围将基于现有数据集。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public GenerateTessellation(object _Output_Feature_Class, object _Extent)
        {
            this._Output_Feature_Class = _Output_Feature_Class;
            this._Extent = _Extent;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Generate Tessellation";

        public override string CallName => "management.GenerateTessellation";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "extent", "geographicTransformations", "outputCoordinateSystem", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_Output_Feature_Class, _Extent, _Shape_Type.GetGPValue(), _Size, _Spatial_Reference];

        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The path and name of the output feature class containing the tessellated grid.</para>
        /// <para>包含镶嵌格网的输出要素类的路径和名称。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _Output_Feature_Class { get; set; }


        /// <summary>
        /// <para>Extent</para>
        /// <para><xdoc>
        ///   <para>The extent that the tessellation will cover. This can be the currently visible area, the extent of a dataset, or manually entered values.</para>
        ///   <bulletList>
        ///     <bullet_item>Default—The extent will be based on the maximum extent of all participating inputs. This is the default.</bullet_item><para/>
        ///     <bullet_item>Union of Inputs—The extent will be based on the maximum extent of all inputs.</bullet_item><para/>
        ///     <bullet_item>Intersection of Inputs—The extent will be based on the minimum area common to all inputs.</bullet_item><para/>
        ///     <bullet_item>Current Display Extent—The extent is equal to the visible display. The option is not available when there is no active map.</bullet_item><para/>
        ///     <bullet_item>As Specified Below—The extent will be based on the minimum and maximum extent values specified.</bullet_item><para/>
        ///     <bullet_item>Browse—The extent will be based on an existing dataset.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>镶嵌将覆盖的范围。这可以是当前可见区域、数据集的范围或手动输入的值。</para>
        ///   <bulletList>
        ///     <bullet_item>默认值 - 范围将基于所有参与输入的最大范围。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>输入并集 - 范围将基于所有输入的最大范围。</bullet_item><para/>
        ///     <bullet_item>输入交点 - 范围将基于所有输入共有的最小面积。</bullet_item><para/>
        ///     <bullet_item>当前显示范围 - 范围等于可见显示。当没有活动地图时，该选项不可用。</bullet_item><para/>
        ///     <bullet_item>如下所述 - 范围将基于指定的最小和最大范围值。</bullet_item><para/>
        ///     <bullet_item>浏览 - 范围将基于现有数据集。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Extent")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _Extent { get; set; }


        /// <summary>
        /// <para>Shape Type</para>
        /// <para><xdoc>
        ///   <para>The type of shape to tessellate.</para>
        ///   <bulletList>
        ///     <bullet_item>Hexagon—A regular six-sided polygon with equal side lengths. Each hexagon's top and bottom sides are parallel with the x-axis of the coordinate system (the top and bottom are flat).</bullet_item><para/>
        ///     <bullet_item>Transverse hexagon—A regular six-sided polygon with equal side lengths. Each hexagon's right and left sides are parallel with the y-axis of the dataset's coordinate system (the top and bottom are pointed).</bullet_item><para/>
        ///     <bullet_item>Square—A regular four-sided polygon with equal side lengths. Each polygon's top and bottom sides are parallel with the x-axis of the coordinate system, and the right and left sides are parallel with the y-axis of the coordinate system.</bullet_item><para/>
        ///     <bullet_item>Diamond—A regular four-sided polygon with equal side lengths. Each polygon's sides are rotated 45 degrees away from the x- and y-axis of the coordinate system.</bullet_item><para/>
        ///     <bullet_item>Triangle—A regular three-sided equilateral polygon.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要镶嵌的形状类型。</para>
        ///   <bulletList>
        ///     <bullet_item>六边形 - 边长相等的正六边形。每个六边形的顶部和底部都平行于坐标系的 x 轴（顶部和底部是平的）。</bullet_item><para/>
        ///     <bullet_item>横向六边形 - 边长相等的正六边形。每个六边形的左右两侧都与数据集坐标系的 y 轴平行（顶部和底部是尖的）。</bullet_item><para/>
        ///     <bullet_item>正方形 - 边长相等的正四边形。每个多边形的顶边和底边都与坐标系的 x 轴平行，左右边与坐标系的 y 轴平行。</bullet_item><para/>
        ///     <bullet_item>菱形 （Diamond） - 边长相等的正四边形。每个面的边都与坐标系的 x 轴和 y 轴旋转 45 度。</bullet_item><para/>
        ///     <bullet_item>三角形 - 正三边等边多边形。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Shape Type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Shape_Type_value _Shape_Type { get; set; } = _Shape_Type_value._HEXAGON;

        public enum _Shape_Type_value
        {
            /// <summary>
            /// <para>Square</para>
            /// <para>Square—A regular four-sided polygon with equal side lengths. Each polygon's top and bottom sides are parallel with the x-axis of the coordinate system, and the right and left sides are parallel with the y-axis of the coordinate system.</para>
            /// <para>正方形 - 边长相等的正四边形。每个多边形的顶边和底边都与坐标系的 x 轴平行，左右边与坐标系的 y 轴平行。</para>
            /// </summary>
            [Description("Square")]
            [GPEnumValue("SQUARE")]
            _SQUARE,

            /// <summary>
            /// <para>Triangle</para>
            /// <para>Triangle—A regular three-sided equilateral polygon.</para>
            /// <para>三角形 - 正三边等边多边形。</para>
            /// </summary>
            [Description("Triangle")]
            [GPEnumValue("TRIANGLE")]
            _TRIANGLE,

            /// <summary>
            /// <para>Hexagon</para>
            /// <para>Hexagon—A regular six-sided polygon with equal side lengths. Each hexagon's top and bottom sides are parallel with the x-axis of the coordinate system (the top and bottom are flat).</para>
            /// <para>六边形 - 边长相等的正六边形。每个六边形的顶部和底部都平行于坐标系的 x 轴（顶部和底部是平的）。</para>
            /// </summary>
            [Description("Hexagon")]
            [GPEnumValue("HEXAGON")]
            _HEXAGON,

            /// <summary>
            /// <para>Diamond</para>
            /// <para>Diamond—A regular four-sided polygon with equal side lengths. Each polygon's sides are rotated 45 degrees away from the x- and y-axis of the coordinate system.</para>
            /// <para>菱形 （Diamond） - 边长相等的正四边形。每个面的边都与坐标系的 x 轴和 y 轴旋转 45 度。</para>
            /// </summary>
            [Description("Diamond")]
            [GPEnumValue("DIAMOND")]
            _DIAMOND,

            /// <summary>
            /// <para>Transverse hexagon</para>
            /// <para>Transverse hexagon—A regular six-sided polygon with equal side lengths. Each hexagon's right and left sides are parallel with the y-axis of the dataset's coordinate system (the top and bottom are pointed).</para>
            /// <para>横向六边形 - 边长相等的正六边形。每个六边形的左右两侧都与数据集坐标系的 y 轴平行（顶部和底部是尖的）。</para>
            /// </summary>
            [Description("Transverse hexagon")]
            [GPEnumValue("TRANSVERSE_HEXAGON")]
            _TRANSVERSE_HEXAGON,

        }

        /// <summary>
        /// <para>Size</para>
        /// <para>The area of each individual shape that comprises the tessellation.</para>
        /// <para>构成镶嵌的每个单独形状的面积。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Size")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _Size { get; set; } = null;


        /// <summary>
        /// <para>Spatial Reference</para>
        /// <para>The spatial reference to which the output dataset will be projected. If a spatial reference is not provided, the output will be projected to the spatial reference of the input extent. If neither has a spatial reference, the output is projected in GCS_WGS_1984.</para>
        /// <para>输出数据集将投影到的空间参考。如果未提供空间参考，则输出将投影到输入范围的空间参考。如果两者都没有空间参考，则输出将投影GCS_WGS_1984。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Spatial Reference")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _Spatial_Reference { get; set; } = null;


        public GenerateTessellation SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}